package arrays;

/**题目：求连续子序列的最大乘积
 * @Author Gavin
 * @date 2022.01.09 15:10
 */
public class array_14 {
    /**
     * 解题思路：
     * 要求连续子序列的最大乘积，我们需要知道一点就是一个最小负数乘以一个负数就可能
     * 为一个最大的正数，所以我们需要把最小的负数也保存起来
     */
    public static int solution(int[] nums){
        if(nums==null||nums.length==0)return 0;
        int max=nums[0],curMax=nums[0],curMin=nums[0];
        for (int i = 1; i < nums.length; i++) {
            //核心点就是连续乘以每一个元素，要么是最大，要么就是最小
            //curMax表示当前正在处理的最大值，核心点，当连续正数乘积之后遇到负数后的第一个正数
            //curMax值就是这个正数的值，相当于从负数之后重新开始计算最大连续子序列乘积了
            //同理，负数也一样
            int a=curMax*nums[i],b=curMin*nums[i],c=nums[i];
            curMax=max(a,b,c);
            curMin=min(a,b,c);
            max=Math.max(max,curMax);
        }
        return max;
    }
    public static int max(int a,int b,int c){
        return Math.max(Math.max(a,b),c);
    }
    public static int min(int a,int b,int c){
        return Math.min(Math.min(a,b),c);
    }

    public static void main(String[] args) {
        int[] nums=new int[]{2,0,-1,3,4};
        System.out.println(solution(nums));
    }
}
